package com.ld.security.user;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.List;

/**
 * UserDetails
 * <p>
 * 承载用户信息的核心接口
 * 该接口实现仅仅存储用户的信息。
 * 后续会将该接口提供的用户信息封装到认证对象Authentication中去。
 */

@Data
@Builder//建造者模式，提供链式调用api
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "user_table")
public class UserModel implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String name;

    @Column(unique = true)
    private String email;

    //    密码
    @JsonIgnore//一定要记得忽略某些重要的字段，防止信息泄露
    private String credentials;

    /*枚举字段，指定采用注解的名称为具体值*/
    @Enumerated(value = EnumType.STRING)
    private Role role;

    /**
     * 返回当前用户的权限合集
     *
     * @return Collection<? extends GrantedAuthority> 权限合集
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
//        返回一个简单授权 SimpleGrantedAuthority:简单授权类
        return List.of(new SimpleGrantedAuthority(role.name()));
    }

    @Override
    public String getUsername() {
        return email;
    }

    /**
     * 账户是否未过期
     *
     * @return boolean true：未过期 false：过期
     */
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     * 账户是否未锁定
     *
     * @return boolean true:未锁定  false：锁定
     */
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    /**
     * IS凭据是否过期
     *
     * @return boolean true：未过期  false：过期
     */
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     * 是否启用
     *
     * @return boolean ture:启用  false：未启用
     */
    @Override
    public boolean isEnabled() {
        return true;
    }

    /**
     * 获取密码-security userDetails方法
     *
     * @return String 用户密码
     */
    @Override
    public String getPassword() {
        return credentials;
    }
}
